package com.demon.framework.common.model.entity;


import com.demon.framework.common.retcode.BaseRetCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 接口统一返回格式
 */
@ApiModel(description = "配合前端统一返回结果的格式工具类")
@Data
@NoArgsConstructor
public class ResultVO<T> implements Serializable {

    private static final long serialVersionUID = -1L;

    /**
     * 状态码  ${@link BaseRetCode}
     * OK-成功,其他-失败
     */
    @ApiModelProperty(notes = "状态码")
    private String code = BaseRetCode.OK.code;

    /**
     * 提示信息
     */
    @ApiModelProperty(notes = "提示信息")
    private String message;

    /**
     * 返回包装类型
     */
    @ApiModelProperty(notes = "数据集合")
    private T result;

    private ResultVO(String msg, String code) {
        this.message = msg;
        this.code = code;
    }

    private ResultVO(BaseRetCode.RetCode code) {
        this.message = code.message;
        this.code = code.code;
    }

    /**
     * 通用的 操作成功
     */
    public static ResultVO<Void> SUCCESS() {
        return new ResultVO<>(BaseRetCode.OK);
    }

    /**
     * 通用的 操作成功时的 返回对象
     */
    public static <T> ResultVO<T> SUCCESS(T result) {
        ResultVO<T> responseObj = new ResultVO<>(BaseRetCode.OK);
        responseObj.result = result;
        return responseObj;
    }

    /**
     * 通用的错误提示方法
     *
     * @param retCode 错误码
     */
    public static ResultVO<Void> ERROR(BaseRetCode.RetCode retCode) {
        return new ResultVO<>(retCode.message, retCode.code);
    }


    /**
     * 通用的错误提示方法
     *
     * @param msg 错误信息
     */
    public static ResultVO<Void> ERROR(String msg) {
        return new ResultVO<>(msg, BaseRetCode.ERR_FAILED.code);
    }

    /**
     * 通用的错误提示方法
     *
     * @param msg 错误信息
     */
    public static ResultVO<Void> ERROR(String msg, String code) {
        return new ResultVO<>(msg, code);
    }

    /**
     * 带错误数据的错误提示方法
     */
    public static <T> ResultVO<T> ERROR(BaseRetCode.RetCode retCode, T result) {
        ResultVO<T> resultVO = new ResultVO<>(retCode);
        resultVO.result = result;
        return resultVO;
    }
}
